/**
 * # 参数列表实体类:
 *  Add - 添加新用户
 * 
 * # 描述:
 *  添加一个新的用户账号。
 *  
 * Copyright (c), 上海沃恩信息科技有限公司.
 * All rights reserved.
 * Licensed under BSD (https://www.pittypat.work/bsd.html).
 */

package com.waln.authority.users.args;

/**
 * 功能 添加新用户 的参数列表。
 */
@pittypat.FunctionAnnotation(transaction = true)
public final class Add extends pittypat.FunctionArgs {
	/**
	 * 用户 Id。
	 * <p>
	 * 当前用户的 Id，由系统自动设置该参数。
	 */
	@pittypat.ParameterAnnotation(position = 0, role = pittypat.ParameterRole.USER_ID)
	public java.util.UUID userId;

	/**
	 * 登录名称。
	 * <p>
	 * 用户的登录名称。
	 */
	@pittypat.ParameterAnnotation(position = 1, maxLength = 50)
	public String loginName;

	/**
	 * 登录密码明文。
	 * <p>
	 * 用户登录密码的明文。
	 */
	@pittypat.ParameterAnnotation(position = 2, fixedLength = true, maxLength = 30)
	public String password;

	/**
	 * 编号。
	 * <p>
	 * 用户的编号，编号是唯一的，比如工号。登录时可以使用编号登录。
	 */
	@pittypat.ParameterAnnotation(position = 3, maxLength = 20)
	public String no;

	/**
	 * 用户名称。
	 * <p>
	 * 用户的友好显示名称。
	 */
	@pittypat.ParameterAnnotation(position = 4, maxLength = 50)
	public String name;

	/**
	 * 手机号码。
	 * <p>
	 * 用户的手机号码，如果提供了手机号码，必须是唯一的。
	 */
	@pittypat.ParameterAnnotation(position = 5, maxLength = 20)
	public String mobile;

	/**
	 * 电子邮件地址。
	 * <p>
	 * 用户的电子邮件地址。如果提供了电子邮件地址，则必须是唯一的。
	 */
	@pittypat.ParameterAnnotation(position = 6, maxLength = 50)
	public String email;

	/**
	 * 登录后首页。
	 * <p>
	 * 用户在登录后进入的页面，由用户自己配置。支持 '~' 作为前缀的路径格式。
	 */
	@pittypat.ParameterAnnotation(position = 7, maxLength = 200)
	public String loginHomeUrl;

	/**
	 * 登录后首页说明。
	 * <p>
	 * 对用户登录后首先进入的页面的说明信息。
	 */
	@pittypat.ParameterAnnotation(position = 8, maxLength = 100)
	public String loginHomeDescription;

	/**
	 * 新用户。
	 * <p>
	 * 如果添加成功，返回新用户的用户信息。
	 */
	@pittypat.ParameterAnnotation(position = 9, direction = pittypat.ParameterDirection.OUT)
	public com.waln.authority.users.data.User user;

	/**
	 * 初始化 Add 类的一个新实例。
	 */
	public Add() {
		super();

		// 用户 Id
		this.userId = null;
		// 登录名称
		this.loginName = null;
		// 登录密码明文
		this.password = null;
		// 编号
		this.no = null;
		// 用户名称
		this.name = null;
		// 手机号码
		this.mobile = null;
		// 电子邮件地址
		this.email = null;
		// 登录后首页
		this.loginHomeUrl = null;
		// 登录后首页说明
		this.loginHomeDescription = null;
		// 新用户
		this.user = null;
	}

	/**
	 * 获取指定名称的参数值。
	 * 
	 * @param name
	 * 			参数名称，不区分大小写。
	 * @return 指定名称的参数值。
	 */
	@Override
	public Object getParameterValue(String name) {
		if (name == null || name.length() == 0) {
			return null;
		}

		switch (name.toLowerCase()) {
			case "userid":
				return this.userId;
			case "loginname":
				return this.loginName;
			case "password":
				return this.password;
			case "no":
				return this.no;
			case "name":
				return this.name;
			case "mobile":
				return this.mobile;
			case "email":
				return this.email;
			case "loginhomeurl":
				return this.loginHomeUrl;
			case "loginhomedescription":
				return this.loginHomeDescription;
			case "user":
				return this.user;
			default:
				return null;
		}
	}

	/**
	 * 设置指定名称的参数值。
	 * 
	 * @param name
	 * 			参数名称，不区分大小写。
	 * @param value
	 * 			参数值。
	 * 
	 * @throws IllegalArgumentException
	 */
	@Override
	public void setParameterValue(String name, Object value) throws IllegalArgumentException {
		if (name == null || name.length() == 0) {
			throw new IllegalArgumentException("没有提供有效的参数名称。");
		}

		switch (name.toLowerCase()) {
			case "userid":
				this.userId = (java.util.UUID) value;
				break;
			case "loginname":
				this.loginName = (String) value;
				break;
			case "password":
				this.password = (String) value;
				break;
			case "no":
				this.no = (String) value;
				break;
			case "name":
				this.name = (String) value;
				break;
			case "mobile":
				this.mobile = (String) value;
				break;
			case "email":
				this.email = (String) value;
				break;
			case "loginhomeurl":
				this.loginHomeUrl = (String) value;
				break;
			case "loginhomedescription":
				this.loginHomeDescription = (String) value;
				break;
			case "user":
				this.user = (com.waln.authority.users.data.User) value;
				break;
			default:
				throw new IllegalArgumentException(name + " 不是 " + this.getClass().getName() + " 的有效参数属性名称。");
		}
	}

	/**
	 * 将当前对象作为 JSON 字符串写入指定的文本流。
	 * 
	 * @param writer
	 * 			目标文本流。
	 * 
	 * @throws IllegalArgumentException
	 * @throws java.io.IOException
	 */
	@Override
	public void write(java.io.Writer writer) throws IllegalArgumentException, java.io.IOException {
		if (writer == null) {
			throw new IllegalArgumentException("writer 为 null。");
		}

		writer.write('{');

		// 用户 Id
		writer.write("\"userId\":");
		pittypat.Json.write(writer, this.userId);
		writer.write(',');

		// 登录名称
		writer.write("\"loginName\":");
		pittypat.Json.write(writer, this.loginName);
		writer.write(',');

		// 登录密码明文
		writer.write("\"password\":");
		pittypat.Json.write(writer, this.password);
		writer.write(',');

		// 编号
		writer.write("\"no\":");
		pittypat.Json.write(writer, this.no);
		writer.write(',');

		// 用户名称
		writer.write("\"name\":");
		pittypat.Json.write(writer, this.name);
		writer.write(',');

		// 手机号码
		writer.write("\"mobile\":");
		pittypat.Json.write(writer, this.mobile);
		writer.write(',');

		// 电子邮件地址
		writer.write("\"email\":");
		pittypat.Json.write(writer, this.email);
		writer.write(',');

		// 登录后首页
		writer.write("\"loginHomeUrl\":");
		pittypat.Json.write(writer, this.loginHomeUrl);
		writer.write(',');

		// 登录后首页说明
		writer.write("\"loginHomeDescription\":");
		pittypat.Json.write(writer, this.loginHomeDescription);
		writer.write(',');

		// 新用户
		writer.write("\"user\":");
		pittypat.Json.write(writer, this.user);

		writer.write('}');
	}
}
